<?php
/**
 *
 * @author Shock
 */
interface IDbQuery
{
    /**
     * Возвращает текущий тип запроса
     * @return string
     */
    function getType ();

    /**
     * @param string|array $fields
     * @return IDbQuery
     */
    function select ();
    /**
     * @param string|array $fields
     * @return IDbQuery
     */
    function insert ();
    /**
     * @param string $inTable
     * @return IDbQuery
     */
    function update ();
    /**
     * @param string $fromTable
     * @return IDbQuery
     */
    function delete ();

    /**
     * Определяет таблицу
     * @param string $fromTable
     * @return IDbQuery
     */
    function table ($table, $as = null);

    /**
     * С какими полями работать (применяется в insert, select)
     * @param array|string $fields
     */
    function fields ();

    /**
     * Какие значения вставить
     * @param string|array $values
     */
    function values ();

    /**
     * Устанавливает значение для update
     * @param string $value
     */
    function set ($value);

    /**
     * INNER JOIN таблицы
     * @param string $table
     * @param string $on
     * @return IDbQuery
     */
    function innerJoin ($table, $as, $on);
    /**
     * LEFT JOIN таблицы
     * @param string $table
     * @param string $on
     * @return IDbQuery
     */
    function leftJoin  ($table, $as, $on);
    /**
     * RIGHT JOIN таблицы
     * @param string $table
     * @param string $on
     * @return IDbQuery
     */
    function rightJoin ($table, $as, $on);

    /**
     * Порядок элементов
     * @param string $by
     * @param bool $desc
     * @return IDbQuery
     */
    function order   ($by, $desc = false);
    /**
     * Условие поиска
     * @param string $cond
     * @return IDbQuery
     */
    function where   ($cond);
    /**
     * Условие поиска
     * @param string $cond
     * @return IDbQuery
     */
    function orWhere   ($cond);
    /**
     * Ограничение выборки
     * @param <type> $from
     * @param <type> $offset
     * @return IDbQuery
     */
    function limit   ($from, $offset = null);
    /**
     * Группировка по полю
     * @param string $field
     * @return IDbQuery
     */
    function group ($field);

    /**
     * "Приготовить" запрос
     * @return IDbQuery
     */
    function compile  ();
    /**
     * Получить "приготовленный" запрос
     * @return string
     */
    function getQuery ();
    /**
     * Выполнить "приготовленный" запрос
     * @return IDbQueryResult
     */
    function run      ();
}
